package org.jeecg.modules.rental.service.impl;


import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.modules.redis.client.JeecgRedisClient;
import org.jeecg.common.rental.vo.LoginRentalAccount;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.iot.api.IControlAPI;
import org.jeecg.modules.iot.cache.EBikeCache;
import org.jeecg.modules.iot.model.EBikeLocation;
import org.jeecg.modules.iot.model.Location;
import org.jeecg.modules.iot.model.power.TaiPower;
import org.jeecg.modules.rental.entity.RentalAccountPackage;
import org.jeecg.modules.rental.entity.RentalEBike;
import org.jeecg.modules.rental.entity.RentalEBikeType;
import org.jeecg.modules.rental.entity.RentalStore;
import org.jeecg.modules.rental.enums.EBikeRentalVerifyEnums;
import org.jeecg.modules.rental.mapper.*;
import org.jeecg.modules.rental.req.AssembleReq;
import org.jeecg.modules.rental.req.ManageEBikeReq;
import org.jeecg.modules.rental.req.SetControlReq;
import org.jeecg.modules.rental.req.SwapCarReq;
import org.jeecg.modules.rental.resp.IotInfoResp;
import org.jeecg.modules.rental.resp.ManageEBikeResp;
import org.jeecg.modules.rental.service.IRentalEBikeService;
import org.jeecg.modules.rental.util.UuidUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Point;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @Description: 租车车辆信息
 * @Author: sean
 * @Date: 2024-04-26
 * @Version: V1.0
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class RentalEBikeServiceImpl extends ServiceImpl<RentalEBikeMapper, RentalEBike> implements IRentalEBikeService {

    private final RentalEBikeMapper rentalCarMapper;
    private final RentalEBikeTypeMapper rentalCarTypeMapper;
    private final RentalStoreMapper rentalStoreMapper;
    private final RentalFenceMapper rentalFenceMapper;
    private final RentalAccountPackageMapper rentalAccountPackageMapper;
    private final JeecgRedisClient jeecgRedisClient;
    private final EBikeCache vehicleCache;
    private final IControlAPI iControlAPI;

    @Autowired
    private EBikeCache eBikeCache;

    @Override
    public IPage<RentalEBike> selectJoinPage(Page<RentalEBike> page, Wrapper wrapper) {
        Page<RentalEBike> pageList = rentalCarMapper.selectJoinPage(page, wrapper);
        if(ObjectUtil.isNotEmpty(pageList.getRecords())){
            List<RentalEBikeType> typeList = rentalCarTypeMapper
                    .selectList(new QueryWrapper<>());
            pageList.getRecords().forEach(item->{
                item.setOnlineStatus(vehicleCache.getVehicleOnlineStatus(item.getCarCode()));
                Optional<RentalEBikeType> eBikeTypeOptions = typeList.stream()
                        .filter(a-> a.getId().equals(item.getCarTypeId())).findFirst();
                eBikeTypeOptions.ifPresent(a-> item.setCarTypeName(a.getCarTypeName()));
            });
        }
        return pageList;
    }

    @Override
    public Boolean editCustomCode(Long ebikeId, String customCode) {
        RentalEBike rentalEBike = rentalCarMapper.selectById(ebikeId);
        rentalEBike.setCustomCode(customCode);
        return baseMapper.updateById(rentalEBike) > 0;
    }

    @Override
    public IotInfoResp iotInfo(String iotCode) {
        IotInfoResp iotInfoResp = new IotInfoResp();
        RentalEBike rentalEBike = baseMapper.selectOne(new QueryWrapper<RentalEBike>()
                .eq("code", iotCode).or().eq("car_code", iotCode));
        String onlineStatus = eBikeCache.getVehicleOnlineStatus(rentalEBike.getCarCode());
        iotInfoResp.setIotCode(rentalEBike.getCarCode());

        if(StrUtil.isNotBlank(rentalEBike.getFrameCode())){
            iotInfoResp.setFrameCode(rentalEBike.getFrameCode());
            iotInfoResp.setDone(Boolean.TRUE);
        }

        iotInfoResp.setEmotorCode(rentalEBike.getEmotorCode());
        iotInfoResp.setCtrlCode(rentalEBike.getCtrlCode());
        iotInfoResp.setBmsCode(rentalEBike.getBmsCode());

        iotInfoResp.setOnlineStatus(onlineStatus);
        TaiPower taiPower= eBikeCache.getVehiclePower(rentalEBike.getCarCode());
        if (taiPower!=null){
            iotInfoResp.setVoltage(Double.valueOf(taiPower.getVoltage()));
            iotInfoResp.setPower(Double.valueOf(taiPower.getRPowCap()));
        }
        return iotInfoResp;
    }

    @Override
    public Boolean assemble(AssembleReq assembleReq) {

        if (assembleReq == null) {
            throw new IllegalArgumentException("组装请求不能为空");
        }
        if (assembleReq.getIotCode() == null || assembleReq.getIotCode().isEmpty()) {
            throw new IllegalArgumentException("IOT编号不能为空");
        }
        // 查询数据库，检查是否存在车辆
        LambdaQueryWrapper<RentalEBike> queryWrapper = new LambdaQueryWrapper<RentalEBike>();
        queryWrapper.eq(RentalEBike::getCarCode, assembleReq.getIotCode());
         List<RentalEBike>  carOldList = rentalCarMapper.selectList(queryWrapper);
        // 如果没有找到任何车辆
        if (carOldList.isEmpty()) {
            System.out.println("车辆不存在，无法更新");
            return false;
        }
        for (RentalEBike rentalEBike : carOldList) {
            if (assembleReq.getFrameCode() != null && !assembleReq.getFrameCode().isEmpty()) {
                rentalEBike.setFrameCode(assembleReq.getFrameCode());
            }
            if (assembleReq.getEmotorCode() != null && !assembleReq.getEmotorCode().isEmpty()) {
                rentalEBike.setEmotorCode(assembleReq.getEmotorCode());
            }
            if (assembleReq.getCtrlCode() != null && !assembleReq.getCtrlCode().isEmpty()) {
                rentalEBike.setCtrlCode(assembleReq.getCtrlCode());
            }
            if (assembleReq.getBmsCode() != null && !assembleReq.getBmsCode().isEmpty()) {
                rentalEBike.setBmsCode(assembleReq.getBmsCode());
            }

            rentalCarMapper.updateById(rentalEBike);
        }

        return true;
    }

    @Override
    public List<RentalEBike> listByCode(String code) {
        LambdaQueryWrapper<RentalEBike> lqw = new LambdaQueryWrapper<>();
        lqw.and(ew -> ew.like(RentalEBike::getCode, "%"+code+"%").or()
                .like(RentalEBike::getCarCode, "%"+code+"%").or()
                .like(RentalEBike::getFrameCode, "%"+code+"%").or()
                .like(RentalEBike::getBmsCode, "%"+code+"%").or()
                .like(RentalEBike::getDashboardCode, "%"+code+"%").or()
                .like(RentalEBike::getEmotorCode, "%"+code+"%").or()
                .like(RentalEBike::getCtrlCode, "%"+code+"%"));
        List<RentalEBike> list = rentalCarMapper.selectList(lqw);
        return list;
    }

    @Override
    public Result<Page<RentalEBike>> selectManageDetailPage(Page page, Wrapper wrapper) {
        //TODO 后续优化数据权限
        Page<RentalEBike> pageList = rentalCarMapper.selectJoinPage(page, wrapper);
        if (null != pageList.getRecords() && !pageList.getRecords().isEmpty()) {
            List<Long> carTypeIds = pageList.getRecords().stream().map(RentalEBike::getCarTypeId).collect(Collectors.toList());
            List<RentalEBikeType> rentalCarTypeList = rentalCarTypeMapper.selectBatchIds(carTypeIds);
            List<Long> meshPointIds = pageList.getRecords().stream().map(RentalEBike::getMeshPointId).collect(Collectors.toList());
            List<RentalStore> chargeMeshPointList = rentalStoreMapper.selectBatchIds(meshPointIds);
            pageList.getRecords().stream().forEach(item -> {
                RentalEBikeType rentalCarType = rentalCarTypeList.stream().filter(a -> a.getId().equals(item.getCarTypeId())).findFirst().orElse(null);
                if (null != rentalCarType) {
                    item.setCarTypeName(rentalCarType.getCarTypeName());
                }
                RentalStore chargeMeshPoint = chargeMeshPointList.stream().filter(a -> a.getId().equals(item.getMeshPointId())).findFirst().orElse(null);
                if (null != chargeMeshPoint) {
                    item.setMeshPointName(chargeMeshPoint.getMeshPointsName());
                }
            });
        }
        return Result.OK(pageList);
    }

    @Override
    public List<EBikeLocation> selectLocationList(Wrapper wrapper) {
        //获取车辆信息
        List<RentalEBike> rentalCarList = baseMapper.selectList(wrapper);
        //获取车辆编号
        List<String> carCodeList = rentalCarList.stream().map(RentalEBike::getCarCode).collect(Collectors.toList());
        List<Point> positions = vehicleCache.locationList(carCodeList);
        List<EBikeLocation> locationDTOList = new ArrayList<>();
        for (int i = 0; i < carCodeList.size() && i < positions.size(); i++) {
            String carCode = carCodeList.get(i);
            EBikeLocation locationDTO = new EBikeLocation();
            locationDTO.setCarCode(carCode); //中控IMEI
            Point position = positions.get(i);
            if(ObjectUtil.isNotEmpty(position)){  //设置经纬度
                locationDTO.setLatitude(position.getY());
                locationDTO.setLongitude(position.getX());
            }
            String vehicleStatus = vehicleCache.getVehicleStatus(carCode);
            locationDTO.setStatus(Integer.getInteger(vehicleStatus));
            Location location= vehicleCache.getVehicleLocation(carCode);
            if(ObjectUtil.isNotEmpty(location) && ObjectUtil.isNotEmpty(location.getMileage())){
                locationDTO.setMileage(roundToTwoDecimalPlaces(location.getMileage()));
            }
            Optional<RentalEBike> rentalCarOptional = rentalCarList.stream().filter(a-> a.getCarCode().equals(carCode)).findFirst();
            rentalCarOptional.ifPresent(a -> locationDTO.setPlate(a.getPlate()));
            TaiPower taiPower = vehicleCache.getVehiclePower(carCode);
            // 设置电力信息
            if (taiPower != null) {
                locationDTO.setRPowCap(taiPower.getRPowCap());
                locationDTO.setRPow(taiPower.getRPow());
                locationDTO.setVoltage(taiPower.getVoltage());
                locationDTO.setCurrent(taiPower.getCurrent());
                if (taiPower.getCurrent() !=null){
                    locationDTO.setIsPower(taiPower.getCurrent() > 0 ? true : false);
                }
            }
            locationDTOList.add(locationDTO);
        }
        return locationDTOList;
    }



    @Override
    public void add(RentalEBike req) {
        if(oConvertUtils.isNotEmpty(req.getMeshPointId())){
            RentalStore rentalStore = rentalStoreMapper.selectById(req.getMeshPointId());
            req.setSysOrgCode(rentalStore.getSysOrgCode());
        }
        //如果没有编号要添加
        req.setCode(UuidUtil.getUnid());
        baseMapper.insert(req);
    }

    @Override
    public void edit(RentalEBike rentalCar) {
        // 更新车辆信息
        if(oConvertUtils.isNotEmpty(rentalCar.getMeshPointId())){
            RentalStore rentalStore = rentalStoreMapper.selectById(rentalCar.getMeshPointId());
            rentalCar.setSysOrgCode(rentalStore.getSysOrgCode());
        }
        // 透传设置
//        handleTransparentSettings(rentalCar);
        // 获取车辆的旧管理员 ID
        LambdaQueryWrapper<RentalEBike> queryWrapper = new LambdaQueryWrapper<RentalEBike>();
//        queryWrapper.eq(RentalEBike::getSysOrgCode, rentalStore.getSysOrgCode());
        queryWrapper.eq(RentalEBike::getCarCode, rentalCar.getCarCode());
        RentalEBike carOld = rentalCarMapper.selectOne(queryWrapper);
        String oldAdminId = null;
        if (carOld != null) {
            oldAdminId = carOld.getManageUserId();
        }
        //如果没有编号要添加
        if (StrUtil.isBlank(rentalCar.getCode())) {
            rentalCar.setCode(UuidUtil.getUnid());
        }
        baseMapper.updateById(rentalCar);
    }



    @Override
    public void addcar() {
        List<String> newCarCoeds = new ArrayList<>();
       /* newCarCoeds.add("867156061904142");
        newCarCoeds.add("867156061884526");
        newCarCoeds.add( "867156061904043");
        newCarCoeds.add( "867156061904266");
        newCarCoeds.add("867156061903540");
        newCarCoeds.add( "867156061918704");
        newCarCoeds.add( "867156061904126");
        newCarCoeds.add( "867156061881449");
        newCarCoeds.add( "867156061903482");
        newCarCoeds.add( "867156061881803");
        newCarCoeds.add( "867156061881423");
        newCarCoeds.add( "867156061887560");
        newCarCoeds.add( "867156061918167");
        newCarCoeds.add( "867156061917706");
        newCarCoeds.add( "867156061917565");
        newCarCoeds.add( "867156061916666");
        newCarCoeds.add( "867156061918464");
        newCarCoeds.add( "867156061917201");
        newCarCoeds.add( "867156061918902");
        newCarCoeds.add( "867156061918241");
        newCarCoeds.add( "867156061918506");
        newCarCoeds.add( "867156061960649");
        newCarCoeds.add( "867156061918860");
        newCarCoeds.add( "867156061916963");
        newCarCoeds.add( "867156061888121");
        newCarCoeds.add( "867156061883544");
        newCarCoeds.add( "867156061960664");
        newCarCoeds.add( "867156061888501");
        newCarCoeds.add( "867156061887982");
        newCarCoeds.add( "867156061887867");
        newCarCoeds.add( "867156061917524");
        newCarCoeds.add( "867156061917508");
        newCarCoeds.add( "867156061917409");
        newCarCoeds.add( "867156061917342");
        newCarCoeds.add( "867156061888022");
        newCarCoeds.add( "867156061960540");
        newCarCoeds.add( "867156061883189");
        newCarCoeds.add( "867156061917227");
        newCarCoeds.add( "867156061920247");
        newCarCoeds.add( "867156061918548");
        newCarCoeds.add( "867156061920726");
        newCarCoeds.add( "867156061920569");
        newCarCoeds.add( "867156061918027");
        newCarCoeds.add( "867156061920387");
        newCarCoeds.add( "867156061918324");
        newCarCoeds.add( "867156061918142");
        newCarCoeds.add( "867156061960748");
        newCarCoeds.add( "867156061918340");
        newCarCoeds.add( "867156061920262");
        newCarCoeds.add( "867156061904068");
        newCarCoeds.add( "867156061920502");
        newCarCoeds.add( "867156061883882");
        newCarCoeds.add( "867156061903284");
        newCarCoeds.add( "867156061920668");
        newCarCoeds.add( "867156061916724");
        newCarCoeds.add( "867156061917888");
        newCarCoeds.add( "867156061883569");
        newCarCoeds.add( "867156061917326");
        newCarCoeds.add( "867156061918100");
        newCarCoeds.add( "867156061920346");
        newCarCoeds.add( "867156061918084");
        newCarCoeds.add( "867156061917144");
        newCarCoeds.add( "867156061917581");
        newCarCoeds.add( "867156061917441");
        newCarCoeds.add( "867156061921245");
        newCarCoeds.add( "867156061916948");
        newCarCoeds.add( "867156061883064");
        newCarCoeds.add( "867156061917920");
        newCarCoeds.add( "867156061921005");
        newCarCoeds.add( "867156061917789");
        newCarCoeds.add( "867156061917243");
        newCarCoeds.add( "867156061922227");
        newCarCoeds.add( "867156061920643");
        newCarCoeds.add( "867156061920544");
        newCarCoeds.add( "867156061916401");
        newCarCoeds.add( "867156061917623");
        newCarCoeds.add( "867156061884583");
        newCarCoeds.add( "867156061917045");
        newCarCoeds.add( "867156061917300");
        newCarCoeds.add( "867156061916765");
        newCarCoeds.add( "867156061918043");
        newCarCoeds.add( "867156061904001");
        newCarCoeds.add( "867156061881621");
        newCarCoeds.add( "867156061881340");
        newCarCoeds.add( "867156061881183");
        newCarCoeds.add( "867156061903805");
        newCarCoeds.add( "867156061881464");
        newCarCoeds.add( "867156061883742");
        newCarCoeds.add( "867156061920601");
        newCarCoeds.add( "867156061884187");
        newCarCoeds.add( "867156061903763");
        newCarCoeds.add( "867156061917003");
        newCarCoeds.add( "867156061904209");
        newCarCoeds.add( "867156061920809");
        newCarCoeds.add( "867156061917383");
        newCarCoeds.add( "867156061881829");
        newCarCoeds.add( "867156061881324");
        newCarCoeds.add( "867156061920429");
        newCarCoeds.add( "867156061903649");
        newCarCoeds.add( "867156061917367");
        newCarCoeds.add( "867156061920288");
        newCarCoeds.add( "867156061884609");
        newCarCoeds.add( "867156061904241");
        newCarCoeds.add( "867156061904522");
        newCarCoeds.add( "867156061918068");
        newCarCoeds.add( "867156061881720");
        newCarCoeds.add( "867156061917961");
        newCarCoeds.add( "867156061882223");
        newCarCoeds.add( "867156061904563");
        newCarCoeds.add( "867156061882082");
        newCarCoeds.add( "867156061884088");
        newCarCoeds.add( "867156061903904");
        newCarCoeds.add( "867156061888048");
        newCarCoeds.add( "867156061883940");
        newCarCoeds.add( "867156061903607");
        newCarCoeds.add( "867156061881886");
        newCarCoeds.add( "867156061883320");
        newCarCoeds.add( "867156061917763");
        newCarCoeds.add( "867156061919488");
        newCarCoeds.add( "867156061903888");
        newCarCoeds.add( "867156061884500");
        newCarCoeds.add( "867156061917805");
        newCarCoeds.add( "867156061916880");
        newCarCoeds.add( "867156061884302");
        newCarCoeds.add( "867156061916922");
        newCarCoeds.add( "867156061883148");
        newCarCoeds.add( "867156061884203");
        newCarCoeds.add( "867156061921948");
        newCarCoeds.add( "867156061881282");
        newCarCoeds.add( "867156061903326");
        newCarCoeds.add( "867156061904480");
        newCarCoeds.add( "867156061883502");
        newCarCoeds.add( "867156061917987");
        newCarCoeds.add( "867156061918381");
        newCarCoeds.add( "867156061918209");
        newCarCoeds.add( "867156061916641");
        newCarCoeds.add( "867156061887909");
        newCarCoeds.add( "867156061883288");
        newCarCoeds.add( "867156061918225");
        newCarCoeds.add( "867156061917086");
        newCarCoeds.add( "867156061916740");
        newCarCoeds.add( "867156061918480");
        newCarCoeds.add( "867156061916781");
        newCarCoeds.add( "867156061917482");
        newCarCoeds.add( "867156061922086");
        newCarCoeds.add( "867156061903441");
        newCarCoeds.add( "867156061917847");
        newCarCoeds.add( "867156061921906");
        newCarCoeds.add( "867156061917466");
        newCarCoeds.add( "867156061884286");
        newCarCoeds.add( "867156061904324");
        newCarCoeds.add( "867156061917268");
        newCarCoeds.add( "867156061881365");
        newCarCoeds.add( "867156061881605");
        newCarCoeds.add( "867156061884146");
        newCarCoeds.add( "867156061904282");
        newCarCoeds.add( "867156061884542");
        newCarCoeds.add( "867156061904100");
        newCarCoeds.add( "867156061882942");
        newCarCoeds.add( "867156061903045");
        newCarCoeds.add( "867156061881860");
        newCarCoeds.add( "867156061917680");
        newCarCoeds.add( "867156061884344");
        newCarCoeds.add( "867156061881902");
        newCarCoeds.add( "867156061904308");
        newCarCoeds.add( "867156061887883");
        newCarCoeds.add( "867156061918282");
        newCarCoeds.add( "867156061887941");
        newCarCoeds.add( "867156061917185");
        newCarCoeds.add( "867156061883601");
        newCarCoeds.add( "867156061882041");
        newCarCoeds.add( "867156061881845");
        newCarCoeds.add( "867156061903623");
        newCarCoeds.add( "867156061960680");
        newCarCoeds.add( "867156061903565");
        newCarCoeds.add( "867156061881761");
        newCarCoeds.add( "867156061917169");
        newCarCoeds.add( "867156061883908");
        newCarCoeds.add( "867156061881480");
        newCarCoeds.add( "867156061917284");
        newCarCoeds.add( "867156061881662");
        newCarCoeds.add( "867156061903243");
        newCarCoeds.add( "867156061881746");
        newCarCoeds.add( "867156061904423");
        newCarCoeds.add( "867156061881928");
        newCarCoeds.add( "867156061882066");
        newCarCoeds.add( "867156061904506");
        newCarCoeds.add( "867156061881688");
        newCarCoeds.add( "867156061916682");
        newCarCoeds.add( "867156061881589");
        newCarCoeds.add( "867156061960508");
        newCarCoeds.add( "867156061960524");
        newCarCoeds.add( "867156061883262");
        newCarCoeds.add( "867156061918969");
        newCarCoeds.add( "867156061904340");
        newCarCoeds.add( "867156061881647");
        newCarCoeds.add( "867156061904548");
        newCarCoeds.add( "867156060677905");
        newCarCoeds.add( "867156060641141");
        newCarCoeds.add( "867156060641224");
        newCarCoeds.add( "867156060630227");
        newCarCoeds.add( "867156060641828");
        newCarCoeds.add( "867156060680222");
        newCarCoeds.add( "867156060677806");
        newCarCoeds.add( "867156060641521");
        newCarCoeds.add( "867156060630300");
        newCarCoeds.add( "867156060641307");
        newCarCoeds.add( "867156060629682");
        newCarCoeds.add( "867156060641323");
        newCarCoeds.add( "867156060677509");
        newCarCoeds.add( "867156060641240");
        newCarCoeds.add( "867156060660943");
        newCarCoeds.add( "867156060677822");
        newCarCoeds.add( "867156060641406");
        newCarCoeds.add( "867156060677681");
        newCarCoeds.add( "867156060630144");
        newCarCoeds.add( "867156060679968");
        newCarCoeds.add( "867156060672328");
        newCarCoeds.add( "867156060679943");
        newCarCoeds.add( "867156060672187");
        newCarCoeds.add( "867156060677608");
        newCarCoeds.add( "867156060677640");
        newCarCoeds.add( "867156060680008");
        newCarCoeds.add( "867156060629989");
        newCarCoeds.add( "867156060630185");
        newCarCoeds.add( "867156060677921");
        newCarCoeds.add( "867156060680263");
        newCarCoeds.add( "867156060672104");
        newCarCoeds.add( "867156060680040");
        newCarCoeds.add( "867156060630086");
        newCarCoeds.add( "867156060677780");
        newCarCoeds.add( "867156060677723");
        newCarCoeds.add( "867156060680123");
        newCarCoeds.add( "867156060677749");
        newCarCoeds.add( "867156060672146");
        newCarCoeds.add( "867156061918084");
        newCarCoeds.add( "867156061903508");
        newCarCoeds.add( "867156061883080");
        newCarCoeds.add( "867156061920981");
        newCarCoeds.add( "867156061903722");
        newCarCoeds.add( "867156061881829");
        newCarCoeds.add( "867156061920882");
        newCarCoeds.add( "867156061903961");
        newCarCoeds.add( "867156061917664");
        newCarCoeds.add( "867156061920361");
        newCarCoeds.add( "867156061903326");
        newCarCoeds.add( "867156060680289");
        newCarCoeds.add( "867156061918365");
        newCarCoeds.add( "867156061884104");
        newCarCoeds.add( "867156061903144");
        newCarCoeds.add( "867156060671965");
        newCarCoeds.add( "867156061342608");
        newCarCoeds.add( "867156061342343");
        newCarCoeds.add( "867156061342665");
        newCarCoeds.add( "867156060672245");
        newCarCoeds.add( "867156061342707");
        newCarCoeds.add( "867156061343424");
        newCarCoeds.add( "867156060672047");
        newCarCoeds.add( "867156061342806");
        newCarCoeds.add( "867156061342640");
        newCarCoeds.add( "867156061342301");
        newCarCoeds.add( "867156061342889");
        newCarCoeds.add( "867156061342483");
        newCarCoeds.add( "867156060672302");
        newCarCoeds.add( "867156061343945");
        newCarCoeds.add( "867156061342327");
        newCarCoeds.add( "867156061342947");
        newCarCoeds.add( "867156061344042");
        newCarCoeds.add( "867156061342723");
        newCarCoeds.add( "867156061342384");
        newCarCoeds.add( "867156061342400");*/
        //newCarCoeds.add("867156061904001");
        newCarCoeds.add("887156061919900");



        int plateCounter = 275;
        for (String newCarCode : newCarCoeds) {

            LambdaQueryWrapper<RentalEBike> queryWrapper = new LambdaQueryWrapper<RentalEBike>();
            queryWrapper.eq(RentalEBike::getCarCode, newCarCode);
            RentalEBike carOld = rentalCarMapper.selectOne(queryWrapper);
            if (carOld != null) {
                return;
            }
            RentalEBike rentalEBike=  new RentalEBike();
            rentalEBike.setCarCode(newCarCode);
            rentalEBike.setPhone(newCarCode.substring(3));
            rentalEBike.setCarTypeId( 1868835963015819266L);
            rentalEBike.setSysOrgCode("A04");
            rentalEBike.setCode(UuidUtil.getUnid());
            rentalEBike.setCreateBy("UnikRideNew");
            rentalEBike.setTenantId("4");
            String plate = String.format("%03d", plateCounter);
            rentalEBike.setPlate(plate);
            rentalEBike.setCustomCode(plate);
            rentalCarMapper.insert(rentalEBike);
            plateCounter++;
        }
    }

    /**
     * 推送电单车(gps和电量信息)信息给客户端
     * @param carCode
     * @return
     */
    @Override
    public Boolean pushEBikeInfo(String carCode) {
//        return iControlAPI.pushEBikeInfo(carCode);
        return true;
    }

    // 处理透传设置
//    private void handleTransparentSettings(RentalEBike rentalCar) {
//        /*测试控制器---设置预估里程*/
//        if (rentalCar.getMileage() != null) {
//            //controlService.setEstimatedRemainingMileage(rentalCar, rentalCar.getMileage());
//            iControlAPI.setEstimatedRemainingMileage(rentalCar.getCarCode(), rentalCar.getPhone(), rentalCar.getMileage());
//        }
//        if (rentalCar.getAssistLevel() != null &&
//                rentalCar.getSpeed() != null &&
//                rentalCar.getWorkModeValue() != 0 &&
//                rentalCar.getStartModeValue() != 0) {
//
//            SpeedOtherConfig speedOtherConfig = new SpeedOtherConfig();
//            speedOtherConfig.setAssistLevel(rentalCar.getAssistLevel());
//            speedOtherConfig.setMotorLock(rentalCar.isMotorLock());
//            speedOtherConfig.setPowerDisable(rentalCar.isPowerDisable());
//            speedOtherConfig.setSpeed(rentalCar.getSpeed());
//            speedOtherConfig.setWorkMode(SpeedOtherConfig.WorkMode.fromValue(rentalCar.getWorkModeValue()));
//            speedOtherConfig.setStartMode(SpeedOtherConfig.StartMode.fromValue(rentalCar.getStartModeValue()));
//
//            //controlService.setSpeed(rentalCar, speedOtherConfig);
//            iControlAPI.setSpeed(rentalCar.getCarCode(), rentalCar.getPhone(), speedOtherConfig);
//        }
//        iControlAPI.setBrakeAndAssistConfig(
//                rentalCar.getCarCode(),
//                rentalCar.getPhone(),
//                true, false, true, 0, 111, true, true
//        );
//        if (rentalCar.getAssistLevel() != null &&
//                rentalCar.getSpeed() != null &&
//                rentalCar.getWorkModeValue() != 0 &&
//                rentalCar.getStartModeValue() != 0) {
//
//            SpeedOtherConfig speedOtherConfig = new SpeedOtherConfig();
//            speedOtherConfig.setAssistLevel(rentalCar.getAssistLevel());
//            speedOtherConfig.setMotorLock(rentalCar.isMotorLock());
//            speedOtherConfig.setPowerDisable(rentalCar.isPowerDisable());
//            speedOtherConfig.setSpeed(rentalCar.getSpeed());
//            speedOtherConfig.setWorkMode(SpeedOtherConfig.WorkMode.fromValue(rentalCar.getWorkModeValue()));
//            speedOtherConfig.setStartMode(SpeedOtherConfig.StartMode.fromValue(rentalCar.getStartModeValue()));
//
//            ///controlService.setSpeed(rentalCar, speedOtherConfig);
//            iControlAPI.setSpeed(rentalCar.getCarCode(), rentalCar.getPhone(), speedOtherConfig);
//        }
//
//        if (rentalCar.getSoftStartLevel() != null && rentalCar.getStartGear() != null) {
//            CentralControlConfig centralControlConfig = new CentralControlConfig();
//            centralControlConfig.setSpeedLimitEnabled(rentalCar.isSpeedLimitEnabled());
//            centralControlConfig.setLinkageEnabled(rentalCar.isLinkageEnabled());
//            centralControlConfig.setEabsEnabled(rentalCar.isEabsEnabled());
//            centralControlConfig.setSlopePreventionEnabled(rentalCar.isSlopePreventionEnabled());
//            centralControlConfig.setTcsEnabled(rentalCar.isTcsEnabled());
//            centralControlConfig.setParkingToPTime(rentalCar.getParkingToPTime());
//            centralControlConfig.setStartGear(rentalCar.getStartGear());
//            //centralControlConfig.setSoftStartEnabled(rentalCar.isSoftStartEnabled());
//            centralControlConfig.setSoftStartLevel(rentalCar.getSoftStartLevel());
//            //controlService.setCentralControlConfig(rentalCar, centralControlConfig);
//            iControlAPI.setCentralControlConfig(rentalCar.getCarCode(), rentalCar.getPhone(), centralControlConfig);
//        }
//
//        if (rentalCar.getSoftStartLevel() != null && rentalCar.getStartGear() != null) {
//            CentralControlConfig centralControlConfig = new CentralControlConfig();
//            centralControlConfig.setSpeedLimitEnabled(rentalCar.isSpeedLimitEnabled());
//            centralControlConfig.setLinkageEnabled(rentalCar.isLinkageEnabled());
//            centralControlConfig.setEabsEnabled(rentalCar.isEabsEnabled());
//            centralControlConfig.setSlopePreventionEnabled(rentalCar.isSlopePreventionEnabled());
//            centralControlConfig.setTcsEnabled(rentalCar.isTcsEnabled());
//            centralControlConfig.setParkingToPTime(rentalCar.getParkingToPTime());
//            centralControlConfig.setStartGear(rentalCar.getStartGear());
//            //centralControlConfig.setSoftStartEnabled(rentalCar.isSoftStartEnabled());
//            centralControlConfig.setSoftStartLevel(rentalCar.getSoftStartLevel());
//            iControlAPI.setCentralControlConfig(rentalCar.getCarCode(), rentalCar.getPhone(), centralControlConfig);
//            //controlService.setCentralControlConfig(rentalCar, centralControlConfig);
//        }
//
//
//        iControlAPI.setBrakeAndAssistConfig(rentalCar.getCarCode(), rentalCar.getPhone(), true, false, false, 1, 1, false, true);
//        if (rentalCar.getGear1Percentage() != null && rentalCar.getGear2Percentage() != null) {
//            iControlAPI.setSpeedPercentages( rentalCar.getCarCode(),
//                    rentalCar.getPhone(),
//                    rentalCar.getGear1Percentage(), rentalCar.getGear2Percentage());
//
//
//            //controlService.setSpeedPercentages(rentalCar, rentalCar.getGear1Percentage(), rentalCar.getGear2Percentage());
//        }
//
//
//        if (rentalCar.getUndervoltageProtection() != null) {
//            //controlService.setUndervoltageProtection(rentalCar, rentalCar.getUndervoltageProtection());
//
//            iControlAPI.setUndervoltageProtection(rentalCar.getCarCode(), rentalCar.getPhone(), rentalCar.getUndervoltageProtection());
//
//        }
//    }


//    private void handleTransparent(SetControlReq setControlReq, RentalEBike rentalCar) {
//        switch (setControlReq.getAddress()) {
//            case "0xA100":
//                if (setControlReq.getAssistLevel() != null &&
//                        setControlReq.getSpeed() != null) {
//
//                    SpeedOtherConfig speedOtherConfig = new SpeedOtherConfig();
//                    speedOtherConfig.setAssistLevel(setControlReq.getAssistLevel());
//                    speedOtherConfig.setMotorLock(setControlReq.isMotorLock());
//                    speedOtherConfig.setPowerDisable(setControlReq.isPowerDisable());
//                    speedOtherConfig.setSpeed(setControlReq.getSpeed());
//                    speedOtherConfig.setWorkMode(SpeedOtherConfig.WorkMode.fromValue(setControlReq.getWorkModeValue()));
//                    speedOtherConfig.setStartMode(SpeedOtherConfig.StartMode.fromValue(setControlReq.getStartModeValue()));
//                    iControlAPI.setSpeed(rentalCar.getCarCode(), rentalCar.getPhone(), speedOtherConfig);
//                    //controlService.setSpeed(rentalCar, speedOtherConfig);
//                }
//                break;
//            case "0xA105":
//                if (setControlReq.getMileage() != null) {
//                    //controlService.setEstimatedRemainingMileage(rentalCar, setControlReq.getMileage());
//                    iControlAPI.setEstimatedRemainingMileage(rentalCar.getCarCode(), rentalCar.getPhone(), setControlReq.getMileage());
//
//
//                }
//                break;
//            case "0xA109":
//                if (setControlReq.getPolePairs() != null) {  // Assuming you have a getPolePairs method in SetControlReq
//                    iControlAPI.setPolePairNumber(rentalCar.getCarCode(), rentalCar.getPhone(), setControlReq.getPolePairs());
//                }
//                break;
//            case "0xA10A":
//                if (setControlReq.getLightOn() != null &&
//                        setControlReq.getBlinkMode() != null &&
//                        setControlReq.getBlinkTimes() != null) {
//
//                    iControlAPI.setTailLightConfig(
//                            rentalCar.getCarCode(),
//                            rentalCar.getPhone(),
//                            setControlReq.getLightOn(),
//                            setControlReq.getBlinkMode(),
//                            setControlReq.getBlinkTimes()
//                    );
//                }
//                break;
//            case "0xA10D":
//                if (setControlReq.getBatteryVoltageType() != null && setControlReq.getCurrentLimit() != null) { // Assuming you have these methods in SetControlReq
//                    iControlAPI.setBatteryVoltageAndCurrentLimit( rentalCar.getCarCode(),
//                            rentalCar.getPhone(), setControlReq.getBatteryVoltageType(), setControlReq.getCurrentLimit());
//                }
//                break;
//            case "0xA10E":
//                if (setControlReq.getSoftStartLevel() != null && setControlReq.getStartGear() != null) {
//                    CentralControlConfig centralControlConfig = new CentralControlConfig();
//                    centralControlConfig.setSpeedLimitEnabled(setControlReq.isSpeedLimitEnabled());
//                    centralControlConfig.setLinkageEnabled(setControlReq.isLinkageEnabled());
//                    centralControlConfig.setEabsEnabled(setControlReq.isEabsEnabled());
//                    centralControlConfig.setSlopePreventionEnabled(setControlReq.isSlopePreventionEnabled());
//                    centralControlConfig.setTcsEnabled(setControlReq.isTcsEnabled());
//                    centralControlConfig.setParkingToPTime(setControlReq.getParkingToPTime());
//                    centralControlConfig.setStartGear(setControlReq.getStartGear());
//                    centralControlConfig.setSoftStartLevel(setControlReq.getSoftStartLevel());
//                    //controlService.setCentralControlConfig(rentalCar, centralControlConfig);
//                    iControlAPI.setCentralControlConfig(rentalCar.getCarCode(), rentalCar.getPhone(), centralControlConfig);
//
//
//                }
//                break;
//            case "0xA10F":
//                if (setControlReq.getUndervoltageProtection() != null) {
//                    iControlAPI.setUndervoltageProtection(rentalCar.getCarCode(), rentalCar.getPhone(), setControlReq.getUndervoltageProtection());
//                }
//                break;
//            case "0xA110":
//                // Assuming you have methods for all the parameters in SetControlReq
//                iControlAPI.setBrakeAndAssistConfig(
//                        rentalCar.getCarCode(),
//                        rentalCar.getPhone(),
//                        setControlReq.isBrakeEnergyRecoveryEnabled(),
//                        setControlReq.isHandleBrakeEnergyRecoveryEnabled(),
//                        setControlReq.isHandleReleasePowerEnabled(),
//                        setControlReq.getRecoveryIntensity(),
//                        setControlReq.getAssistIntensity(),
//                        setControlReq.isHandleCruiseControlEnabled(),
//                        setControlReq.isButtonCruiseControlEnabled()
//                );
//                /*break;*/
//            case "0xA113":
//                if (setControlReq.getGear1Percentage() != null && setControlReq.getGear2Percentage() != null) {
//                    iControlAPI.setSpeedPercentages( rentalCar.getCarCode(),
//                            rentalCar.getPhone(),
//                            setControlReq.getGear1Percentage(), setControlReq.getGear2Percentage());
//                }
//                break;
//            default:
//                break;
//        }
//        // ... 其他代码 ...
//    }


    // 封装更新车辆和管理员缓存信息的方法
//    private void updateVehicleAdminCache(String vehicleId, String oldAdminId, String newAdminId, Location location, TaiPower power) {
//        if (location != null) {
//            // 如果旧管理员存在，则从旧管理员的车辆列表中移除该车辆
//            if (oldAdminId != null) {
//                vehicleCache.removeVehicleFromAdmin(vehicleId, oldAdminId);
//            }
//
//            // 如果新管理员存在，则将车辆添加到新管理员的车辆列表中
//            if (newAdminId != null) {
//                if (location != null) {
//                    //@TODO设置管理员
//                    //vehicleCache.setVehicleAdmin(vehicleId, newAdminId, location.getLongitude(), location.getLatitude());
//                }
//                if (power != null) {
//                    vehicleCache.setVehiclePowerAdmin(vehicleId, newAdminId, Double.valueOf(power.getRPowCap()));
//                }
//
//            }
//        }
//    }

//    @Override
//    @DataOrgScope(orgField = "rc.sys_org_code")
//    public Result<Page<RentalManageCarRsp>> carDetail(RentalManageCarReq req, Page page) {
//        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//        req.setSysOrgCode(OrgThreadHolder.get());
//        if (DataScopeEnums.DATA_SCOPE_STORE.getValue().equals(loginUser.getRoleDataScope())) {
//            List<RentalStore> rentalStoreList = rentalStoreMapper
//                    .selectList(new QueryWrapper<RentalStore>().eq("person_charge_id", loginUser.getId()));
//            String storeIds = rentalStoreList.stream().map(a -> a.getId().toString()).collect(Collectors.joining(","));
//            req.setDataScopeSql(" AND ( FIND_IN_SET(mesh_point_id, '" + storeIds + "') ) AND manage_user_id = " + loginUser.getId());
//        } else if (DataScopeEnums.DATA_SCOPE_MANAGE.getValue().equals(loginUser.getRoleDataScope())) {
//            req.setDataScopeSql(" AND manage_user_id = '" + loginUser.getId() + "'");
//        }
//        Page<RentalEBike> listResult = new Page<>();
//        // 根据查询条件在租 未租状态来判断
//        if (req.getIsLease() != null) {
//            if (req.getIsLease() == 1) {
//                listResult = rentalCarMapper.selectRentedCars(page, req);
//            } else {
//                listResult = rentalCarMapper.selectNotRentedCars(page, req);
//            }
//        } else {
//            listResult = rentalCarMapper.selectManageAllJoinPage(page, req);
//        }
//
//
//        // 获取分页查询结果的记录
//        List<RentalEBike> carList = listResult.getRecords();
//
//        // 创建新分页对象
//        Page<RentalManageCarRsp> rspPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
//
//        // 创建结果列表
//        List<RentalManageCarRsp> rspList = carList.stream().map(car -> {
//            RentalManageCarRsp rsp = new RentalManageCarRsp();
//            // 复制 car 的属性到 rsp
//            BeanUtils.copyProperties(car, rsp);
//
//            String carCode = car.getCarCode();
//            Location location = vehicleCache.getVehicleLocation(carCode);
//            TaiPower taiPower = vehicleCache.getVehiclePower(carCode);
//
//            String status = vehicleCache.getVehicleStatus(carCode);
//            int isLease = 0;
//            //车辆状态 1-待出租 2-已出租 3-维修中
//            if ("1".equals(status)) {
//                isLease = 0;
//            } else if ("2".equals(status)) {
//                isLease = 1;
//            }
//            rsp.setIsLease(isLease); // 最后设置最终值
//
//            if (location != null) {
//                rsp.setRange(roundToTwoDecimalPlaces(location.getRMileage()));
//            }
//            if (taiPower != null) {
//                rsp.setPower(Double.valueOf(taiPower.getRPowCap()));
//                rsp.setCurrent(taiPower.getCurrent());
//                rsp.setVoltage(roundToTwoDecimalPlaces(taiPower.getVoltage()));
//                if (taiPower.getCurrent() != null && taiPower.getCurrent() > 0) {
//                    rsp.setIscharge(1);
//                } else {
//                    rsp.setIscharge(0);
//                }
//            }
//
//            return rsp;
//        }).collect(Collectors.toList());
//
//        // 设置分页记录
//        rspPage.setRecords(rspList);
//
//        // 返回结果
//        return Result.OK(rspPage);
//    }

//    @Override
//    @DataOrgScope(orgField = "rc.sys_org_code")
//    public Result<List<RentalManageCarRsp>> carDetailNoNeedPage(RentalManageCarReq req) {
//        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//       /* if(DataScopeEnums.DATA_SCOPE_STORE.getValue().equals(loginUser.getRoleDataScope())){
//            List<RentalStore> rentalStoreList = rentalStoreMapper
//                    .selectList(new QueryWrapper<RentalStore>().eq("person_charge_id", loginUser.getId()));
//            String storeIds = rentalStoreList.stream().map(a-> a.getId().toString()).collect(Collectors.joining(","));
//            req.setDataScopeSql(" AND ( FIND_IN_SET(mesh_point_id, '" + storeIds + "') ) AND manage_user_id = " + loginUser.getId());
//        } else if (DataScopeEnums.DATA_SCOPE_MANAGE.getValue().equals(loginUser.getRoleDataScope())){
//            req.setDataScopeSql(" AND manage_user_id = '" + loginUser.getId()+"'");
//        }
//
//       */
//        String dataScopeSql = "";
//// 检查是否为门店级别的数据权限
//        if (DataScopeEnums.DATA_SCOPE_STORE.getValue().equals(loginUser.getRoleDataScope())) {
//            // 查询当前用户负责的门店列表
//            List<RentalStore> rentalStoreList = rentalStoreMapper
//                    .selectList(new QueryWrapper<RentalStore>().eq("person_charge_id", loginUser.getId()));
//            // 获取门店ID列表并拼接成字符串
//            String storeIds = rentalStoreList.stream()
//                    .map(a -> a.getId().toString())
//                    .collect(Collectors.joining(","));
//            // 拼接数据权限SQL
//            dataScopeSql = " AND ( FIND_IN_SET(mesh_point_id, '" + storeIds + "') ) AND manage_user_id = " + loginUser.getId();
//        }// 检查是否为管理级别的数据权限
//        else if (DataScopeEnums.DATA_SCOPE_MANAGE.getValue().equals(loginUser.getRoleDataScope())) {
//            // 拼接管理级别的数据权限SQL
//            dataScopeSql = " AND manage_user_id = '" + loginUser.getId() + "'";
//        }
//        // 检查是否有 code 信息，如果有则追加 code 查询条件
//        if (req.getCode() != null && !req.getCode().isEmpty()) {
//            dataScopeSql += " AND code = '" + req.getCode() + "'";  // 拼接 code 查询条件
//        }
//
//// 将拼接后的 SQL 设置到 req 对象中
//        req.setDataScopeSql(dataScopeSql);
//        List<RentalEBike> carList;
//        // 根据查询条件在租 未租状态来判断
//        if (req.getIsLease() != null) {
//            if (req.getIsLease() == 1) {
//                carList = rentalCarMapper.selectRentedCars(req);
//            } else {
//                carList = rentalCarMapper.selectNotRentedCars(req);
//            }
//        } else {
//            carList = rentalCarMapper.selectManageAllJoinPage(req);
//        }
//
//        // 创建结果列表
//        List<RentalManageCarRsp> rspList = carList.stream().map(car -> {
//            RentalManageCarRsp rsp = new RentalManageCarRsp();
//            // 复制 car 的属性到 rsp
//            BeanUtils.copyProperties(car, rsp);
//
//            String carCode = car.getCarCode();
//            //Location location = locationService.queryByDeviceId(carCode);
//
//            Location location=iControlAPI.queryLocationByDeviceId(carCode);
//            //TaiPower taiPower = powerService.queryLastByDeviceId(carCode);
//            TaiPower taiPower = iControlAPI.queryTaiPowerLastByDeviceId(carCode);
//            String status = vehicleCache.getVehicleStatus(carCode);
//            int isLease = 0;
//            //车辆状态 1-待出租 2-已出租 3-维修中
//            if ("1".equals(status)) {
//                isLease = 0;
//            } else if ("2".equals(status)) {
//                isLease = 1;
//            }
//            rsp.setIsLease(isLease); // 最后设置最终值
//            if (location != null) {
//                rsp.setRange(roundToTwoDecimalPlaces(location.getRMileage()));
//            }
//            if (taiPower != null) {
//                rsp.setPower(Double.valueOf(taiPower.getRPowCap()));
//                rsp.setCurrent(taiPower.getCurrent());
//                rsp.setVoltage(roundToTwoDecimalPlaces(taiPower.getVoltage()));
//                rsp.setRemainingKwh(divideByThousandAndFormat(taiPower.getRPow()));
//                rsp.setLatitude(location.getLatitude());
//                rsp.setLongitude(location.getLongitude());
//                if (taiPower.getCurrent() != null && taiPower.getCurrent() > 0) {
//                    rsp.setIscharge(1);
//                } else {
//                    rsp.setIscharge(0);
//                }
//            }
//
//            return rsp;
//        }).collect(Collectors.toList());
//
//        // 返回结果
//        return Result.OK(rspList);
//    }

//    @Override
//    public Result<List<RentalManageCarRsp>> carDetailOrderNoNeedPage(RentalManageCarReq req) {
//        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//        if ("distance".equals(req.getSortField())) {
//            //@TODO 暂时不做
//            //List<RentalManageCarRsp> list = vehicleCache.getNearestVehiclesByAdmin(loginUser.getId(), req.getLongitude(), req.getLatitude(), 10000, 10000);
//            return null;
//        } else if ("power".equals(req.getSortField())) {
//           //@TODO 获取电量
//            // List<RentalManageCarRsp> list = vehicleCache.getVehiclesSortedByPowers(loginUser.getId(), 1000, req.isAscending(), loginUser.getOrgCode());
//            //return Result.OK(list);
//            return null;
//        } else {
//            return carDetailNoNeedPage(req);
//        }
//
//    }

    @Override
    public Result<String> swap(SwapCarReq swapCarReq) {
        String imei = swapCarReq.getImei().replaceAll("\\s+", "");;
        String sn = swapCarReq.getSn().replaceAll("\\s+", "");;
        RentalEBike car = rentalCarMapper.selectById(swapCarReq.getCarId());
        if (car != null) {
            String phone = null;
            car.setCarCode(imei);
            car.setPhone(sn);
            car.setBlueCode(imei);
            car.setTerminalId(imei);
        }
        rentalCarMapper.updateById(car);
        return Result.ok("car.service.swap.success");
    }


    @Override
    public void setControl(SetControlReq setControlReq) {
        RentalEBike rentalCar = baseMapper.selectById(setControlReq.getCarId());
//        handleTransparent(setControlReq, rentalCar);
    }

    @Override
    public void batchSetControl(SetControlReq setControlReq) {
        // 获取 carIds 数组
        String[] carIds = setControlReq.getCarIds();
        // 判断 carIds 是否为空
        if (carIds == null || carIds.length == 0) {
            // 处理 carIds 为空的情况，例如抛出异常或返回错误信息
            throw new IllegalArgumentException("carIds cannot be empty");
            // 或者
            // return Result.error("carIds 不能为空");
        }
        // 遍历 carIds 数组，对每辆车进行设置
        for (String carId : carIds) {
            RentalEBike rentalCar = baseMapper.selectById(carId);
            if (rentalCar != null) {
//                handleTransparent(setControlReq, rentalCar);
            }
        }
    }

    @Override
    public List<ManageEBikeResp> selectManageList(ManageEBikeReq req, Wrapper wrapper) {
        List<ManageEBikeResp> manageList = this.selectManageWithDetailList(wrapper);
        if ("distance".equals(req.getSortField())) {
            //@TODO 查询并按距离排序
        } else if ("power".equals(req.getSortField())) {
            //@TODO 查询并按电量排序
        }
        return manageList;
    }

    @Override
    public List<ManageEBikeResp> selectManageWithDetailList(Wrapper wrapper) {
        List<RentalEBike> list = baseMapper.selectList(wrapper);
        //TODO 后续添加过滤租赁状态
        // 创建结果列表
        List<ManageEBikeResp> resultList = new ArrayList<ManageEBikeResp>();
        list.stream().forEach(item->{
            ManageEBikeResp rsp = new ManageEBikeResp();
            // 复制 car 的属性到 rsp
            BeanUtils.copyProperties(item, rsp);
            String carCode = item.getCarCode();
            Location location = vehicleCache.getVehicleLocation(carCode);
            TaiPower taiPower = vehicleCache.getVehiclePower(carCode);
            String status = vehicleCache.getVehicleStatus(carCode);
            int isLease = 0;
            //车辆状态 1-待出租 2-已出租 3-维修中
            if ("1".equals(status)) {
                isLease = 0;
            } else if ("2".equals(status)) {
                isLease = 1;
            }
            rsp.setIsLease(isLease); // 最后设置最终值
            if (location != null) {
                rsp.setRange(roundToTwoDecimalPlaces(location.getRMileage()));
                rsp.setLatitude(location.getLatitude());
                rsp.setLongitude(location.getLongitude());
            }
            if (taiPower != null) {
                rsp.setPower(Double.valueOf(taiPower.getRPowCap()));
                rsp.setCurrent(taiPower.getCurrent());
                rsp.setVoltage(roundToTwoDecimalPlaces(taiPower.getVoltage()));
                rsp.setRemainingKwh(divideByThousandAndFormat(taiPower.getRPow()));
                if (taiPower.getCurrent() != null && taiPower.getCurrent() > 0) {
                    rsp.setIscharge(1);
                } else {
                    rsp.setIscharge(0);
                }
            }
            resultList.add(rsp);
        });
        return resultList;
    }

    @Override
    public Result<List<RentalEBike>> listNoTenant(RentalEBike rentalCar) {
        QueryWrapper<RentalEBike> queryWrapper = new QueryWrapper<>();
        if (rentalCar.getCarCode() != null) {
            queryWrapper.eq("car_code", rentalCar.getCarCode());
        }
        // ... 其他查询条件
        List<RentalEBike> rentalCars = rentalCarMapper.listNoTenant(queryWrapper);
        return Result.OK(rentalCars);
    }

    @Override
    public RentalEBike getByIdNoTenant(String id) {
        return rentalCarMapper.getByIdNoTenant(id);
    }



//    @Override
//    public Result<RentalEBike> verifyCar(String carCode, String openid) {
//        // 查询车辆信息
//        LambdaQueryWrapper<RentalEBike> carQuery = new LambdaQueryWrapper<>();
//        carQuery.eq(RentalEBike::getCarCode, carCode);
//        RentalEBike rentalCar = rentalCarMapper.selectOne(carQuery);
//
//        //TODO 后续优化验证逻辑
////        if (rentalCar == null) {
////            VehicleResultCodeEnums VEHICLE_NOT_FOUND = VehicleResultCodeEnums.VEHICLE_NOT_FOUND;
////            return new Result(VEHICLE_NOT_FOUND.getCode(), VEHICLE_NOT_FOUND.getMessage());
////        }
////
////        // 查询车辆的有效订单
////        LambdaQueryWrapper<RentalAccountPackage> packageQuery = new LambdaQueryWrapper<>();
////        packageQuery.eq(RentalAccountPackage::getCarId, rentalCar.getId());
////        packageQuery.and(wrapper -> wrapper.eq(RentalAccountPackage::getPkgStatus, "1"));
////        RentalAccountPackage rentalAccountPackage = rentalAccountPackageService.getOne(packageQuery, false);
////        if (rentalAccountPackage != null) {
////            //车子是不是当前用户租的
////            if (StrUtil.isNotBlank(openid) && rentalAccountPackage.getAccountId().equals(openid)) {
////                VehicleResultCodeEnums VEHICLE_BELONGS_TO_YOU = VehicleResultCodeEnums.VEHICLE_BELONGS_TO_YOU;
////                return new Result(VEHICLE_BELONGS_TO_YOU.getCode(), VEHICLE_BELONGS_TO_YOU.getMessage());
////            } else {
////                VehicleResultCodeEnums VEHICLE_HAS_USED = VehicleResultCodeEnums.VEHICLE_HAS_USED;
////                return new Result(VEHICLE_HAS_USED.getCode(), VEHICLE_HAS_USED.getMessage());
////            }
////        }
////
////        List<RentalAccountPackage> accountPackageList = rentalAccountPackageService.effectivePackages(openid);
////        if (null != accountPackageList && !accountPackageList.isEmpty() && accountPackageList.size() > 0) {
////            VehicleResultCodeEnums NOT_ALLOWED_RENTAL_MULTIPLE_VEHICLE = VehicleResultCodeEnums.NOT_ALLOWED_RENTAL_MULTIPLE_VEHICLE;
////            return new Result(NOT_ALLOWED_RENTAL_MULTIPLE_VEHICLE.getCode(), NOT_ALLOWED_RENTAL_MULTIPLE_VEHICLE.getMessage());
////        }
//
//        return Result.OK(rentalCar);
//    }

    @Override
    public Result<RentalEBike> newVerify(String code, Boolean verifyCarId) {
        // 查询车辆信息
        LambdaQueryWrapper<RentalEBike> carQuery = new LambdaQueryWrapper<>();
        carQuery.eq(RentalEBike::getCode, code);
        RentalEBike rentalCar = rentalCarMapper.selectOne(carQuery);
        //TODO 有序优化验证逻辑
        if (ObjectUtil.isEmpty(rentalCar)) {
            EBikeRentalVerifyEnums VEHICLE_NOT_FOUND = EBikeRentalVerifyEnums.VEHICLE_NOT_FOUND;
            return Result.error(VEHICLE_NOT_FOUND.getCode(), VEHICLE_NOT_FOUND.getMessage());
        }

        if (ObjectUtil.isEmpty(rentalCar.getCarTypeId())) {
            EBikeRentalVerifyEnums VEHICLE_NOT_TYPE = EBikeRentalVerifyEnums.VEHICLE_NOT_TYPE;
            return Result.error(VEHICLE_NOT_TYPE.getCode(), VEHICLE_NOT_TYPE.getMessage());
        }

        if (ObjectUtil.isEmpty(rentalCar.getMeshPointId())) {
            EBikeRentalVerifyEnums VEHICLE_NOT_STORE = EBikeRentalVerifyEnums.VEHICLE_NOT_STORE;
            return Result.error(VEHICLE_NOT_STORE.getCode(), VEHICLE_NOT_STORE.getMessage());
        }

        // 查询车辆的有效订单
        LambdaQueryWrapper<RentalAccountPackage> packageQuery = new LambdaQueryWrapper<>();
        packageQuery.eq(RentalAccountPackage::getCarId, rentalCar.getId());
        packageQuery.and(wrapper -> wrapper.eq(RentalAccountPackage::getPkgStatus, "1"));
        RentalAccountPackage rentalAccountPackage = rentalAccountPackageMapper.selectOne(packageQuery);

        LoginRentalAccount rentalAccount = (LoginRentalAccount) SecurityUtils.getSubject().getPrincipal();
        String accountId = rentalAccount.getId().toString();

        if (rentalAccountPackage != null) {
            //车子是不是当前用户租的
            if (StrUtil.isNotBlank(accountId) && rentalAccountPackage.getAccountId().equals(accountId)) {
                EBikeRentalVerifyEnums VEHICLE_BELONGS_TO_YOU = EBikeRentalVerifyEnums.VEHICLE_BELONGS_TO_YOU;
                return Result.error(VEHICLE_BELONGS_TO_YOU.getCode(), VEHICLE_BELONGS_TO_YOU.getMessage());
            } else {
                EBikeRentalVerifyEnums VEHICLE_HAS_USED = EBikeRentalVerifyEnums.VEHICLE_HAS_USED;
                return Result.error(VEHICLE_HAS_USED.getCode(), VEHICLE_HAS_USED.getMessage());
            }
        }

        QueryWrapper<RentalAccountPackage> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("account_id", accountId);
        queryWrapper.eq("pkg_status","1");
        //检验车辆id
        if(verifyCarId){
            queryWrapper.isNotNull("car_id");
        }
        List<RentalAccountPackage> accountPackageList = rentalAccountPackageMapper.effectivePackages(queryWrapper);
        if (null != accountPackageList && !accountPackageList.isEmpty() && accountPackageList.size() > 0) {
            EBikeRentalVerifyEnums NOT_ALLOWED_RENTAL_MULTIPLE_VEHICLE = EBikeRentalVerifyEnums.NOT_ALLOWED_RENTAL_MULTIPLE_VEHICLE;
            return Result.error(NOT_ALLOWED_RENTAL_MULTIPLE_VEHICLE.getCode(), NOT_ALLOWED_RENTAL_MULTIPLE_VEHICLE.getMessage());
        }

        return Result.OK(rentalCar);
    }

    @Override
    public void setFence(RentalEBike rentalCar) {
        if (rentalCar.getFenceId() != null) {
            RentalEBike entity = rentalCarMapper.selectById(rentalCar.getId());
            if (ObjectUtil.isNotEmpty(entity)) {
                rentalCar.setFenceId(rentalCar.getFenceId());
                rentalCarMapper.updateById(rentalCar);
            }
        }
    }

    @Override
    public List<RentalEBike> listWithType(List<Long> carIds) {
        List<RentalEBike> rentalCarList = baseMapper.selectBatchIds(carIds);
        if (ObjectUtil.isNotEmpty(rentalCarList)) {
            List<Long> carTypeIds = rentalCarList.stream().map(RentalEBike::getCarTypeId).collect(Collectors.toList());
            List<RentalEBikeType> rentalCarTypeList = rentalCarTypeMapper.selectBatchIds(carTypeIds);
            rentalCarList.forEach(item -> {
                RentalEBikeType rentalCarType = rentalCarTypeList.stream().filter(a -> a.getId().equals(item.getCarTypeId())).findFirst().orElse(null);
                if (ObjectUtil.isNotEmpty(rentalCarType)) {
                    item.setCarTypeName(rentalCarType.getCarTypeName());
                    item.setCarTypeImage(rentalCarType.getCarImage());
                }
            });
        }
        return rentalCarList;
    }

//    @Override
//    public List<EBikeLocation> selectCarLocationList(RentalEBike req) {
//        //获取车辆信息
//        List<RentalEBike> rentalCarList = baseMapper.selectList(new QueryWrapper<RentalEBike>()
//                .eq(StrUtil.isNotBlank(req.getSysOrgCode()), "sys_org_code", req.getSysOrgCode()));
//        //获取车辆编号
//        List<String> carCodeList = rentalCarList.stream().map(RentalEBike::getCarCode).collect(Collectors.toList());
//        List<EBikeLocation> locationDTOList = vehicleCache.getVehicleLocation(carCodeList, req.getSysOrgCode());
//        return locationDTOList;
//    }

//
//    @Override
//    public String selectCarTrackList(RentalEBike req) throws JsonProcessingException {
//        return "";
//    }
//
//    @Override
//    public String selectCarTrackList(CarTrackReq req) {
//        String pathJson = null;
//        // 示例数据
//        // 设置开始时间和结束时间
//        // 获取当前时间
//        LocalDateTime now = LocalDateTime.now();
//        // 如果 startTime 和 endTime 都为空，查询当天的数据
//        if (req.getStartTime() == null && req.getEndTime() == null) {
//            req.setStartTime(LocalDate.now().atStartOfDay());
//            req.setEndTime(LocalDate.now().atTime(LocalTime.MAX));
//        }
//        // 如果 startTime 为空，设置 startTime 为当天的开始时间
//        if (req.getStartTime() == null) {
//            req.setStartTime(LocalDate.now().atStartOfDay());
//        }
//        // 如果 endTime 为空，设置 endTime 为当前时间
//        if (req.getEndTime() == null) {
//            req.setEndTime(now);
//        }
//
//
//        Timestamp endTime = convertToTimestamp(req.getEndTime());
//        Timestamp startTime = convertToTimestamp(req.getStartTime());
//
//        List<LocationJson> carTrackList =  iControlAPI.queryLocationsByTimeRange(req.getCarCode(), startTime, endTime);
//        //List<LocationJson> simplifiedTrackList = RamerDouglasPeucker.rdpSimplify(carTrackList, 0.000001);
//        // 使用 Douglas-Peucker 算法简化轨迹数据，设置 epsilon 为 0.0001 以提高精度
//        List<LocationJson> simplifiedTrackList = DouglasPeucker.simplify(carTrackList, 0.0001);
//        try {
//            // 转换
//            pathJson = convertToPathJson(simplifiedTrackList);
//        } catch (JsonProcessingException e) {
//            throw new RuntimeException(e);
//        }
//        return pathJson;
//    }
//
//    @Override
//    public String getTrackList(EBikeTrackReq trackReq) {
//        //参数校验
//        if (ObjectUtil.isNotEmpty(trackReq.getStartTime()) && ObjectUtil.isNotEmpty(trackReq.getEndTime())) {
//            if (trackReq.getStartTime().isAfter(trackReq.getEndTime())) {
//                throw new JeecgBootException("开始时间不能晚与结束时间");
//            }
//        }
//
//        LoginRentalAccount rentalAccount = (LoginRentalAccount) SecurityUtils.getSubject().getPrincipal();
//        RentalPayAccount rentalPayAccount = rentalPayAccountMapper.selectById(rentalAccount.getAccountId());
//        if (ObjectUtil.isEmpty(rentalPayAccount.getCarId())) {
//            throw new JeecgBootException("账户没有绑定电单车");
//        }
//        RentalEBike rentalCar = rentalCarMapper.selectById(rentalPayAccount.getCarId());
//        if (ObjectUtil.isEmpty(rentalCar)) {
//            throw new JeecgBootException("未找到对应电单车信息");
//        }
//
//        String pathJson = "";
//        //默认时间范围
//        LocalDateTime startTime = LocalDate.now().atStartOfDay();
//        LocalDateTime endTime = LocalDate.now().atTime(LocalTime.MAX);
//
//        // 如果 startTime 为空，设置 startTime 为当天的开始时间
//        if (ObjectUtil.isNotEmpty(trackReq.getStartTime())) {
//            startTime = trackReq.getStartTime();
//        }
//
//        // 如果 endTime 为空，设置 endTime 为当前时间
//        if (ObjectUtil.isNotEmpty(trackReq.getEndTime())) {
//            endTime = trackReq.getEndTime();
//        }
//
//        Timestamp startTimestamp = convertToTimestamp(startTime);
//        Timestamp endTimestamp = convertToTimestamp(endTime);
//
//        List<LocationJson> carTrackList = iControlAPI.queryLocationsByTimeRange(rentalCar.getCarCode(), startTimestamp, endTimestamp);
//        List<LocationJson> simplifiedTrackList = DouglasPeucker.simplify(carTrackList, 0.0001);
//        try {
//            // 转换
//            pathJson = convertToPathJson(simplifiedTrackList);
//        } catch (JsonProcessingException e) {
//            throw new RuntimeException(e);
//        }
//        return pathJson;
//    }


//    @Override
//    public CarLocationDTO queryInfoBycode(RentalEBike car) {
//        CarLocationDTO carLocationDTO = new CarLocationDTO();
//        TaiPower taiPower = vehicleCache.getVehiclePower(car.getCarCode());
//        //TaiPower taiPower = powerService.queryLastByDeviceId(car.getCarCode());
//
//        //Location location = locationService.queryByDeviceId(car.getCarCode());
//
//        Location location = vehicleCache.getVehicleLocation(car.getCarCode());
//        LambdaQueryWrapper<RentalAccountPackage> rentalWrapper = new LambdaQueryWrapper<RentalAccountPackage>()
//                .eq(RentalAccountPackage::getCarId, car.getId())
//                .isNull(RentalAccountPackage::getReturnTime)
//                .eq(RentalAccountPackage::getDepositStatus, 0);
//        List<RentalAccountPackage> rentalAccountPackages = rentalAccountPackageService.list(rentalWrapper);
//        carLocationDTO.setPlate(car.getPlate());
//        if (location != null) {
//            // 设置车辆位置信息
//            carLocationDTO.setLatitude(location.getLatitude());
//            carLocationDTO.setLongitude(location.getLongitude());
//            carLocationDTO.setCarCode(car.getCarCode());
//        }
//
//        // 设置电力信息
//        if (taiPower != null) {
//            carLocationDTO.setRPowCap(taiPower.getRPowCap());
//            carLocationDTO.setRPow(taiPower.getRPow());
//            carLocationDTO.setVoltage(taiPower.getVoltage());
//            carLocationDTO.setCurrent(taiPower.getCurrent());
//            // 根据 current 判断是否正在充电
//            carLocationDTO.setIsPower(taiPower.getCurrent() > 0);
//        }
//
//        // 设置租赁状态
//        carLocationDTO.setIsLease(rentalAccountPackages.isEmpty() ? 0 : 1);
//
//        // 设置车辆状态
//        if (rentalAccountPackages.size() > 0) {
//            carLocationDTO.setIsLease(2);
//        } else {
//            carLocationDTO.setIsLease(1);
//        }
//
//        return carLocationDTO;
//    }

//    public static String convertToPathJson(List<LocationJson> carTrackList) throws JsonProcessingException {
//        ObjectMapper objectMapper = new ObjectMapper();
//        ArrayNode arrayNode = objectMapper.createArrayNode();
//
//        for (LocationJson location : carTrackList) {
//            ObjectNode objectNode = objectMapper.createObjectNode();
//            objectNode.put("lat", location.getLat());
//            objectNode.put("lng", location.getLng());
//            objectNode.put("speed", location.getSpeed());
//            objectNode.put("mil", location.getMileage());
//            arrayNode.add(objectNode);
//        }
//
//        return objectMapper.writeValueAsString(arrayNode);
//    }

//    private Timestamp convertToTimestamp(LocalDateTime localDateTime) {
//        return localDateTime != null ? Timestamp.valueOf(localDateTime) : null;
//    }

    public static float roundToTwoDecimalPlaces(Float value) {
        // 检查是否为空或无效值
        if (value == null || Float.isNaN(value) || Float.isInfinite(value)) {
            return 0f;
        }
        BigDecimal bd = new BigDecimal(Float.toString(value));
        bd = bd.setScale(2, RoundingMode.HALF_UP);
        return bd.floatValue();
    }


    public static Float divideByThousandAndFormat(Float value) {
        if (value == null) {
            return 0f;  // 如果为空，返回 0f
        }
        float result = value / 1000;
        DecimalFormat df = new DecimalFormat("0.00");
        return Float.parseFloat(df.format(result));
    }

}
